/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package cz.worsik.vypocty.topeni.tepelneztraty.model;

import cz.worsik.vypocty.topeni.tepelneztraty.service.VypoctyService;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.DecimalFormat;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author 231260
 */
public class Otvor {
	
	private String nazev;
	private Integer delka;
	private Integer vyska;
	private Double soucinitel_k;
	private Double soucinitel_i;
	private Boolean okno;
	private Integer delkaSpar = 0;
	
	private Double default_soucinitel_k = 0d;
	private Double default_soucinitel_i = 0d;
	
	DecimalFormat format = new DecimalFormat("#000.##");
	
	public Otvor(Boolean je_okno)
	{
		format.setDecimalSeparatorAlwaysShown(false);
		this.okno = je_okno;
	}

	public Boolean isOkno() {
		return okno;
	}

	public Integer getDelka() {
		return delka;
	}

	public void setDelka(Integer delka) {
		this.delka = delka;
	}

	public String getNazev() {
		return nazev;
	}

	public void setNazev(String nazev) {
		this.nazev = nazev;
	}
	
	public void setNazev(int index)
	{
		/*
		String str = (isOkno()) ? "O_" : "D_";
		
		setNazev(str+format.format(index));
		*/
		
		setNazev((isOkno() ? "Okno" : "Dveře"));
	}

	public Double getSoucinitel_k() {
		if (soucinitel_k == null)
			return default_soucinitel_k;
		return soucinitel_k;
	}

	public void setSoucinitel_k(Double soucinitel_k) {
		this.soucinitel_k = soucinitel_k;
	}

	public void setDefault_soucinitel_k(Double default_soucinitel_k) {
		this.default_soucinitel_k = default_soucinitel_k;
	}

	public Double getSoucinitel_i() {
		if (soucinitel_i == null)
			return default_soucinitel_i;
		return soucinitel_i;
	}

	public void setSoucinitel_i(Double soucinitel_i) {
		this.soucinitel_i = soucinitel_i;
	}

	public void setDefault_soucinitel_i(Double default_soucinitel_i) {
		this.default_soucinitel_i = default_soucinitel_i;
	}

	public Integer getVyska() {
		return vyska;
	}

	public void setVyska(Integer vyska) {
		this.vyska = vyska;
	}
	
	public Integer getDelkaSpar() {
		return this.delkaSpar;
	}
	
	public void setDelkaSpar(Integer delka_spar) {
		this.delkaSpar = delka_spar;
	}
	
	public Object[] getRowData(Stena stena)
	{
		return new Object[] {
			// Název
			getNazev(),
			// Stena
			stena.getNazev(),
			// Delka
			getDelka(),
			// Vyska
			getVyska(),
			// Delka spar
			getDelkaSpar(),
			// Svetova Strana
			stena.getSvetovaStrana(),
			// Plocha
			getPlocha(),
			// Soucinitel
			getSoucinitel_k(),
			// Teplota za kci
			stena.getTeplota_za_kci(),
			// Tepelna ztrata
			getTepelnaZtrata(stena),
			// Soucinitel iLV
			getSoucinitel_i(),
			// Infiltrace
			getInfiltrace(stena)
			
/*
		new SloupecTableModel("Otvor","Název otvoru",false,String.class,40,""),
		new SloupecTableModel("Stěna","Název stěny",false,String.class,40,""),
		new SloupecTableModel("Délka","Délka (mm)",true,Integer.class,50,"setDelka"),
		new SloupecTableModel("Výška","Výška (mm)",true,Integer.class,50,"setVyska"),
		new SloupecTableModel("Strana","Světová strana",true,SvetovaStrana.class,60),
		new SloupecTableModel("Plocha","<html>Plocha otvoru (m<sup>2</sup>)</html>",false,Double.class,50,""),
		new SloupecTableModel("SPT","<html>Součinitel prostupu tepla (Wm<sup>-2</sup> K<sup>-1</sup> )</html>",true,Double.class,30,"setSoucinitel_k"),
		new SloupecTableModel("TZK","Teplota za konstrukcí",true,Integer.class,30,"setTeplota_za_kci"),
		new SloupecTableModel("Tepelná ztráta","Tepelná ztráta (W)",false,Double.class,80,"")
*/
		};
	}

	public Double getPlocha() {
		Double delka_mm = new Double(getDelka())/1000d;
		Double vyska_mm = new Double(getVyska())/1000d;
		
		return delka_mm * vyska_mm;
	}
	
	public Double getTepelnaZtrata(Stena stena)
	{
		Mistnost mistnost = stena.getMistnost();
		return VypoctyService.tepelnaZtrata(getPlocha(),getSoucinitel_k(),mistnost.getTeplota_vnitrni(),stena.getTeplota_za_kci());
	}
	
	public Double getInfiltrace(Stena stena)
	{
		Mistnost mistnost = stena.getMistnost();
		return VypoctyService.infiltrace(delkaSpar, getSoucinitel_i(), mistnost.getObjekt().getChar_cislo_budovy(),mistnost.getTeplota_vnitrni(),stena.getTeplota_za_kci());
	}
	
	public void setProperty(String metoda, Object hodnota, Class<?> trida)
	{
		if ("".equals(metoda))
			return;
		
		Method setter;
			
		try
		{
			setter = this.getClass().getDeclaredMethod(metoda, new Class[] {trida});
		}
		catch (NoSuchMethodException e)
		{
			setter = null;
		}
		
		if (setter != null)
		{
			try {
				setter.invoke(this, hodnota);
				
			} catch (IllegalAccessException ex) {
				Logger.getLogger(Stena.class.getName()).log(Level.SEVERE, null, ex);
			} catch (IllegalArgumentException ex) {
				Logger.getLogger(Stena.class.getName()).log(Level.SEVERE, null, ex);
			} catch (InvocationTargetException ex) {
				Logger.getLogger(Stena.class.getName()).log(Level.SEVERE, null, ex);
			}
		}
	}
}
